package javaCode.chapter10.homework;

/**
 * @author 徐州城
 * @version 1.0
 */
public class Homework06 {
    public static void main(String[] args) {

        Person p = new Person("唐僧", new Horse());
        p.passRiver();
        p.common();
        p.common();
        p.passRiver();
        p.sitAirplane();
    }
}

/*
1、有一个交通工具接口类Vehicles，有work接口方法
2、有Horse类和Boat类分别实现Vehicles
3、创建交通工具工厂类，有两个方法分别获得交通工具Horse和Boat
4、有Person类，有name和Vehicles属性，在构造器中为两个属性赋值
5、实例化Person对象 "唐僧"，要求一般情况下用 Horse作为交通工具，遇到大河时用Boat作为交通工具
6、增加一个情况，如果唐僧过火焰山，使用 飞机 ==> 程序扩展性，我们前面的程序结构就非常好扩展
 */
interface Vehicles{
    void work();
}

class Horse implements Vehicles{
    @Override
    public void work() {
        System.out.println("一般情况骑马...");
    }
}

class Boat implements Vehicles{
    @Override
    public void work() {
        System.out.println("过河坐船...");
    }
}

class Plane implements Vehicles{
    @Override
    public void work() {
        System.out.println("过火焰山坐飞机...");
    }
}

class VehiclesFactory {
    //马始终是一匹
    private static Horse horse = new Horse(); //饿汉式
    private VehiclesFactory(){}
    //3、创建交通工具工厂类，有两个方法分别获得交通工具Horse和Boat
    //这里，我们将方法做成static
    public static Horse getHorse(){
        return horse;
    }

    public static Boat getBoat(){
        return new Boat();
    }

    public static Plane getPlant(){
        return new Plane();
    }
}

class Person{
    public String name;
    public Vehicles vehicles;

    public Person(String name, Vehicles vehicles) {
        this.name = name;
        this.vehicles = vehicles;
    }

    //5、实例化Person对象 "唐僧"，要求一般情况下用 Horse作为交通工具，遇到大河时用Boat作为交通工具
    //这里涉及到一个编程思想，就是可以把具体的要求，封装成方法 -> 这里就是编程思想
    public void passRiver(){
        //先得到船
//        Boat boat = VehiclesFactory.getBoat();
//        boat.work();
        //判断一下，当前的 vehicles 属性是null，就获取一艘船
//        if (vehicles == null) {
        if (!(vehicles instanceof Boat)) {
            vehicles = VehiclesFactory.getBoat();
        }
        vehicles.work();
    }

    public void common(){
        //得到马
        //判断一下，当前的 vehicles 属性是null，就获取一匹马
        if (!(vehicles instanceof Horse)){
            //这里使用的是多态
           vehicles = VehiclesFactory.getHorse();
        }
        //这里体现使用接口调用
        vehicles.work();
    }

    public void sitAirplane(){
        if (!(vehicles instanceof Plane)) {
            vehicles = VehiclesFactory.getPlant();
        }
        vehicles.work();
    }
}